/*******************************************************************************

        SSC0143 - Programação Concorrente
        Prof. Julio Cesar Estrela

        T1 - Calculo de PI com 10000000 de casas decimais

        Grupo:

        Daniel de Oliveira Pereira              6427171
        Guilherme Takasawa Yagui                6426698
        Vinícius Marques Stocco                 6427233

        Março de 2013

********************************************************************************
                                Algoritmo de Monte Carlo - versão sequencial
*******************************************************************************/

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
#include <gmp.h>

#define NUM_ITERACAO 50000 

//gerador de floats randômicos;
float f_randomico() {
        return ((float)(random())/(float)(RAND_MAX));
}

int main(void)
{
    FILE *p_file;
	clock_t t;
	
    float x;
    float y;
    float teste;

    mpf_t P_dentro; //variável que armazena o numero de pontos dentro do circulo;
	mpf_t P_total;  //variável que armazena o numero de pontos total;
    mpf_t Pi;
    mpf_t aux;
    
    mpf_init(aux);

	//define a precisão para todas as chamadas de mpf_init;
    mpf_set_default_prec(33300000); 

    mpf_init(P_total);
    mpf_init(P_dentro);
    mpf_init(Pi);

    //marca o clock inicial da execução do algoritmo;
	t = clock();
	mpf_set_d(P_total,0);

	while(mpf_cmp_d(P_total,100000000.0) < 0)
	{
		x = f_randomico();
		y = f_randomico();
		teste = pow(x,2) + pow(y,2);

		//se o ponto estiver dentro da circunferência, entra no if;
		if (teste <= 1) {
			mpf_add_ui(P_dentro, P_dentro, 1);
			mpf_add_ui(P_total, P_total, 1);
		} else {
			mpf_add_ui(P_total, P_total, 1);
		}
    }

    mpf_div(aux,P_dentro,P_total);
    mpf_mul_ui(Pi,aux,4);

    //calcula o numero clocks necessário para executar o algoritmo;
    t = clock() - t;       
    printf("\nTempo de execucao : %.5f s \n\n", (double) t / CLOCKS_PER_SEC);

    //abre o arquivo pra escrita e guarda o valor de Pi nele;
   	p_file = fopen("pi_monte_carlo_sequencial.txt", "w");
    mpf_out_str(p_file, 10, 10000000, Pi);
    fclose(p_file);

    return 0;
}

